package models


type TaskHost struct {
    Id        int     `xorm:"int pk autoincr"`
    TaskId    int     `xorm:"int not null index"`
    HostId    int16   `xorm:"smallint not null index"`
}

type TaskHostDetail struct {
    TaskHost `xorm:"extends"`
    Name string
    Port int
    Alias string
}

func (TaskHostDetail) TableName() string  {
    return TablePrefix + "task_host"
}

func hostTableName() []string {
    return []string{TablePrefix + "host", "h"}
}

func (th *TaskHost) Remove(taskId int) error {
    _, err := Db.Where("task_id = ?", taskId).Delete(new(TaskHost))

    return err
}

func (th *TaskHost) Add(taskId int, hostIds []int) error {

    err := th.Remove(taskId)
    if err != nil {
        return err
    }

    taskHosts := make([]TaskHost, len(hostIds))
    for i, value := range hostIds {
        taskHosts[i].TaskId = taskId
        taskHosts[i].HostId = int16(value)
    }

    _, err = Db.Insert(&taskHosts)

    return err
}

func (th *TaskHost) GetHostIdsByTaskId(taskId int) ([]TaskHostDetail, error) {
    list := make([]TaskHostDetail, 0)
    fields := "th.id,th.host_id,h.alias,h.name,h.port"
    err := Db.Alias("th").
        Join("LEFT", hostTableName(), "th.host_id=h.id").
        Where("th.task_id = ?", taskId).
        Cols(fields).
        Find(&list)

    return list, err
}

func (th *TaskHost) GetTaskIdsByHostId(hostId int16) ([]interface{}, error)  {
    list := make([]TaskHost, 0)
    err := Db.Where("host_id = ?", hostId).Cols("task_id").Find(&list)
    if err != nil {
        return nil, err
    }

    taskIds := make([]interface{}, len(list))
    for i, value := range list {
        taskIds[i] = value.TaskId
    }

    return taskIds, err
}

// 判断主机id是否有引用
func (th *TaskHost) HostIdExist(hostId int16) (bool, error) {
    count, err := Db.Where("host_id = ?", hostId).Count(th);

    return count > 0, err
}